SPSS EXECUTE 命令详解:何时使用以及为什么?
作者:Ruben Geert van den Berg,归属于 SPSS A-Z
EXECUTE
命令用于执行待处理的转换(pending transformations)。然而,许多 SPSS 用户并不清楚这到底意味着什么。更重要的是,你何时应该(不应该)运行 EXECUTE
命令?以及,在什么情况下你真正需要它?
让我们深入探讨一下。我们将使用 adratings.sav 数据集进行演示,该数据集的一部分如下图所示。
SPSS 中的 “转换待处理” (Transformations Pending)
正如你可能已经了解到的,我们的数据包含了 18 位受访者对 3 个不同广告的评分。假设我们需要计算 ad1
的一个修正版本,我们将其命名为 cad1
,方法是在每个分数上加 10 分。
一个简单的方法是使用 COMPUTE 命令,例如 compute cad1 = ad1 + 10.
。如果你只运行这段 语法,你的数据视图将会如下图所示。
那么,状态栏中的 “转换待处理” 是什么意思?我的修正后的分数在哪里?我告诉 SPSS 计算它们,但它并没有执行!
然而,只需运行 execute.
就可以成功完成我们的转换。
为什么我们需要 EXECUTE?
基本上,我们在 SPSS 中所做的所有事情都是通过命令完成的。如果你直接从菜单操作,你可能看不到这些命令——正如 SPSS 语法 - 你应该使用它的六个理由 中解释的那样,这是一个灾难。
总而言之,SPSS 命令分为 3 种基本类型:
- 过程 (procedures):是必须检查所有个案的命令。例如 FREQUENCIES、DESCRIPTIVES 和
SORT CASES
,以及所有图表和统计检验。这些命令要求 SPSS 立即“遍历”所有个案。 - 转换 (transformations):是会检查所有个案的命令,但只有在真正需要时才会执行。常见的转换包括 COMPUTE、RECODE、IF 和 SELECT IF。
- 其他命令 (other commands):不检查任何个案。例如 FILTER、VARIABLE LABELS 和
ADD VALUE LABELS
。
如果你想知道一个命令是过程、转换还是其他类型,请查阅 所有 SPSS 命令概览。
现在想象一下你是 SPSS——这并不难做到。你打开了一个包含 100,000 个个案的数据集。如果有人要求你 COMPUTE
一些东西,你必须遍历所有 100,000 个个案。这是一项相当大的工作!
然后,如果用户要求 FREQUENCIES
,你必须再次遍历所有 100,000 个个案。因此,为了节省计算时间和电力,SPSS 倾向于只遍历所有个案一次,并一次性完成 COMPUTE
和 FREQUENCIES
。这就是为什么它不会立即执行某些命令——这些命令被称为转换命令。
SPSS 转换命令 (SPSS Transformation Commands)
现在,如果我们查阅关于 COMPUTE
的命令语法参考,我们会看到以下内容:
COMPUTE
是一个转换命令
“它被存储,等待执行 (it is stored, pending)” 这句话表明 COMPUTE
是一个转换。这意味着如果我们想在继续之前在数据编辑器中查看结果,我们需要 EXECUTE
它。
SPSS 过程 (SPSS Procedures)
如果我们查找 FREQUENCIES
,手册会告诉我们:
FREQUENCIES
是一个过程
一个“读取活动数据集 (reads the active dataset)”的命令是一个过程。
这意味着在 FREQUENCIES
之前运行 EXECUTE
是没有意义的,只会减慢 SPSS 的速度。
同样,在 VARIABLE LABELS 或 RENAME VARIABLES
之后运行 EXECUTE
也是没有意义的:这些不是转换,而是立即生效的,因此没有任何待处理的转换需要执行。
重要的是,一些转换数据的命令在技术上是过程,而不是转换。例如 ALTER TYPE、AGGREGATE 和 RANK。
RANK
转换你的数据,但它是一个过程,而不是一个转换。
何时使用 EXECUTE?
- 如果你有待处理的转换,并且想在执行其他操作之前直观地检查结果,请使用
EXECUTE
。 - 在极少数情况下,你需要
EXECUTE
才能使你的语法正确运行。
那么,在什么情况下你真正需要 EXECUTE
呢?我熟悉 3 种情况,我将在下面介绍它们。同样,所有示例都使用 adratings.sav 数据集。
1. 在 DELETE VARIABLES 之前使用 EXECUTE
***错误的方法:计算总和并删除输入变量。
**
compute total = sum(ad1 to ad3).
delete variables ad1 to ad3.
***正确的方法:计算总和并删除输入变量。
**
compute total = sum(ad1 to ad3).
execute.
delete variables ad1 to ad3.
2. 在 LAG 函数之前使用 EXECUTE
***错误的方法:计算前一个案例的 ad1,然后在原始 ad1 上加 10。
**
compute prev_ad1 = lag(ad1).
compute ad1 = ad1 + 10.
execute.
***正确的方法:计算前一个案例的 ad1,然后在原始 ad1 上加 10。
**
compute prev_ad1 = lag(ad1).
execute.
compute ad1 = ad1 + 10.
execute.
3. 在使用 $Casenum 之后使用 EXECUTE
***错误的方法:删除前 10 个案例。
**
compute casenum = $casenum.
select if casenum > 10.
execute.
***正确的方法:删除前 10 个案例。
**
compute casenum = $casenum.
execute.
select if casenum > 10.
execute.